#ifndef GlslShader_h
#define GlslShader_h
/**
@brief Class de Gestion simplifier et paramètrable des fontions Glsl. \n Informations complémentaires :  \n - Opengl v3.1 \n - Glsl v1.4 \n - Extention GLee \n
@author Bourgès Cyril
@date 5 juillet 2009 \n 7 août 2009\n 12 septembre 2009 \n 14 octobre 2011
@see Site sur la doc Glsl :
 http://www.opengl.org/registry/specs/ARB/shader_objects.txt \n
 http://www.opengl.org/sdk/docs/man/xhtml/ \n

Site des Extention opengl : \n
- http://elf-stone.com/glee.php
- http://glew.sourceforge.net/

*/

//---STD-------------------------------------------------------------
#include <string>
#include <map>

//---SShader-----------------------------------------------------------
#include "CShader.h"

//---Using------------------------------------------------------------
using std::map;
using std::string;

//-------------------------------------------------------------------

namespace SShader {

class GlslShader : public CShader {

private:

  /// < nom variable, <taille tableau, type du tableau> >
  map<string, map<int, int> > vNameUniform ;
  /// < nom variable, [Ecart entre les données, Case de la première donnée, Dimention des donnée, Type, Nb du buffer associer] > 
  map<string, int* > vNameVertex ;
  /// < nom variable, [taille tableau, type du tableau, numero VertexAttribArray], idVertexBufferArray, mode MAJ affichage > 
  map<string, int* > vNameFragment ;

  ///< nom variable, donnée >
  map<string, void*> vDataUniform ;
//   map<string, void*> vDataFragment ;
  map<int, unsigned int> vTextureId ;

  ///variable VBO et VA
  unsigned int iVAO ;
  bool isInitVAO ;

  ///Variable de gestion
  bool normalizeVertex ;
  bool isVertexLink ;

protected:
  GlslShader() ;

public:
  GlslShader(string _sVertex, string _sPixel) ;
  GlslShader(const CShader &_shader) ;
  GlslShader(const GlslShader &copie) ;
  ~GlslShader() ;

  void InitialiseVAO () ;
  unsigned int getIdBuffer(string _vertexName) ;

  void addDonneUniform(string _sName, int _iCount, int _sType, void* _Data ) ;
  void addDonneVertex(string *_sName, GLsizei *_stride, int *_iDebut, int *_iDimention,int _inbElement, int _iMiseajour, int _iTypeBuffer, int _sType, int iCount, void* _Data ) ;
  void addDonneFragment(string _sName, int _sType, int _IdData, int level) ;
  void addDonneMatrix(string _sName, int _iCountWidth, int _iCountHeight, float* _Data )  ;
  void removeDonne(string _sName) ;

  void useAttribute () ;

  void addTextureId(int _NumberArb, unsigned int _Id) ;
  void removeTextureId(int _NumberArb) ;
  void addName (int _NumberArb, string _sName) ;
  void removeName (string _sName) ;
  void MultiTexCoord (int _NumberArb, int _TYPE, int _Dimension, void* _Data) ;

  void enableShader() ;
  void disableShader() ;

  bool changeNormalize () ;

private:

  void CreateGlUniform (string _Name, void* _Data,  map<int, int> _Type) ;
  void CreateGlAttribute (string _Name, void* _Data,  map<int, int> _Type) ;
  void FrameBufferTexture() ;
  void linkVertexName () ;
  void VertexAttribPointer () ;

public:
  enum eType {
    DOUBLE = GL_DOUBLE,
    FLOAT = GL_FLOAT,
    USHORT = GL_UNSIGNED_SHORT,
    SHORT = GL_SHORT,
    UINT = GL_UNSIGNED_INT,
    INT = GL_INT,
    UBYTE = GL_UNSIGNED_BYTE,
    BYTE = GL_BYTE,
    BOOL = GL_BOOL,
    MATRIX,
    MATRIX_X,
    MATRIX_Y,
    UNIFORM = 0,
    ATTRIBUTE = 30,
    STREAM_DRAW = GL_STREAM_DRAW,  ///vous mettez vos données à jour à chaque affichage ( glDraw*() );
    DYNAMIC_DRAW = GL_DYNAMIC_DRAW, /// vous mettez fréquemment à jour vos données. (plus d'une fois par affichage);
    STATIC_DRAW = GL_STATIC_DRAW   /// vous mettez peu souvent voir jamais vos données à jour.
  } ;

} ; //---CGlsl
}   //---namespace SShader
#endif
